package com.example.launibleplugin.listener

import com.example.launibleplugin.model.BluetoothDevice
import com.example.launibleplugin.model.ConnectionInfo
import com.example.launibleplugin.model.DataRecord

/**
 * 蓝牙事件监听器接口
 * Function: 定义蓝牙操作相关的回调事件
 * Note: 用于向上层应用通知蓝牙状态变化和数据接收
 */
interface BluetoothEventListener {
    
    // =========================== 设备扫描事件 ===========================
    
    /**
     * Function: 扫描开始回调
     * Note: 当开始扫描蓝牙设备时触发
     */
    fun onScanStarted() {}
    
    /**
     * Function: 发现设备回调
     * Parameter: device - 发现的蓝牙设备信息
     * Note: 每发现一个设备时触发
     */
    fun onDeviceFound(device: BluetoothDevice) {}
    
    /**
     * Function: 扫描完成回调
     * Parameter: devices - 扫描到的所有设备列表
     * Note: 扫描结束时触发，包含所有发现的设备
     */
    fun onScanCompleted(devices: List<BluetoothDevice>) {}
    
    /**
     * Function: 扫描失败回调
     * Parameter: errorCode - 错误代码
     * Parameter: errorMessage - 错误描述
     * Note: 扫描过程中发生错误时触发
     */
    fun onScanFailed(errorCode: Int, errorMessage: String) {}
    
    // =========================== 连接状态事件 ===========================
    
    /**
     * Function: 连接状态变化回调
     * Parameter: connectionInfo - 连接信息
     * Note: 连接状态发生变化时触发
     */
    fun onConnectionStateChanged(connectionInfo: ConnectionInfo) {}
    
    /**
     * Function: 连接成功回调
     * Parameter: device - 已连接的设备
     * Parameter: connectionInfo - 连接信息
     * Note: 设备连接成功时触发
     */
    fun onDeviceConnected(device: BluetoothDevice, connectionInfo: ConnectionInfo) {}
    
    /**
     * Function: 连接断开回调
     * Parameter: device - 断开连接的设备
     * Parameter: connectionInfo - 连接信息
     * Note: 设备断开连接时触发
     */
    fun onDeviceDisconnected(device: BluetoothDevice, connectionInfo: ConnectionInfo) {}
    
    /**
     * Function: 连接失败回调
     * Parameter: device - 连接失败的设备
     * Parameter: errorCode - 错误代码
     * Parameter: errorMessage - 错误描述
     * Note: 设备连接失败时触发
     */
    fun onConnectionFailed(device: BluetoothDevice, errorCode: Int, errorMessage: String) {}
    
    // =========================== 数据传输事件 ===========================
    
    /**
     * Function: 接收到数据回调
     * Parameter: dataRecord - 接收到的数据记录
     * Note: 从设备接收到数据时触发
     */
    fun onDataReceived(dataRecord: DataRecord) {}
    
    /**
     * Function: 数据发送成功回调
     * Parameter: data - 发送的数据
     * Parameter: deviceId - 目标设备ID
     * Note: 数据发送成功时触发
     */
    fun onDataSent(data: ByteArray, deviceId: String) {}
    
    /**
     * Function: 数据发送失败回调
     * Parameter: data - 发送失败的数据
     * Parameter: deviceId - 目标设备ID
     * Parameter: errorCode - 错误代码
     * Parameter: errorMessage - 错误描述
     * Note: 数据发送失败时触发
     */
    fun onDataSendFailed(data: ByteArray, deviceId: String, errorCode: Int, errorMessage: String) {}
    
    /**
     * Function: 协议消息接收回调
     * Parameter: protocolMessage - 接收到的协议消息
     * Parameter: deviceId - 设备ID
     * Note: 接收到新的协议消息时触发（如AxDateMessage、AxFvcMessage等）
     */
    fun onProtocolMessageReceived(protocolMessage: com.example.launibleplugin.protocol.ProtocolMessage, deviceId: String) {}
    
    // =========================== 服务发现事件 ===========================
    
    /**
     * Function: 服务发现完成回调
     * Parameter: deviceId - 设备ID
     * Parameter: services - 发现的服务UUID列表
     * Note: GATT服务发现完成时触发
     */
    fun onServicesDiscovered(deviceId: String, services: List<String>) {}
    
    /**
     * Function: 特征值变化回调
     * Parameter: deviceId - 设备ID
     * Parameter: characteristicUuid - 特征UUID
     * Parameter: value - 特征值
     * Note: 订阅的特征值发生变化时触发
     */
    fun onCharacteristicChanged(deviceId: String, characteristicUuid: String, value: ByteArray) {}
    
    // =========================== 错误和异常事件 ===========================
    
    /**
     * Function: 蓝牙适配器状态变化回调
     * Parameter: isEnabled - 蓝牙是否启用
     * Note: 蓝牙开关状态变化时触发
     */
    fun onBluetoothStateChanged(isEnabled: Boolean) {}
    
    /**
     * Function: 权限请求结果回调
     * Parameter: permissions - 权限列表
     * Parameter: grantResults - 授权结果
     * Note: 权限请求完成时触发
     */
    fun onPermissionResult(permissions: Array<String>, grantResults: IntArray) {}
    
    /**
     * Function: 通用错误回调
     * Parameter: errorCode - 错误代码
     * Parameter: errorMessage - 错误描述
     * Parameter: throwable - 异常对象（可选）
     * Note: 发生未分类的错误时触发
     */
    fun onError(errorCode: Int, errorMessage: String, throwable: Throwable? = null) {}
}

/**
 * 简化的蓝牙事件监听器
 * Function: 提供默认实现的事件监听器基类
 * Note: 继承此类可以只重写需要的方法
 */
abstract class SimpleBluetoothEventListener : BluetoothEventListener {
    
    override fun onScanStarted() {
        // 默认空实现
    }
    
    override fun onDeviceFound(device: BluetoothDevice) {
        // 默认空实现
    }
    
    override fun onScanCompleted(devices: List<BluetoothDevice>) {
        // 默认空实现
    }
    
    override fun onScanFailed(errorCode: Int, errorMessage: String) {
        // 默认空实现
    }
    
    override fun onConnectionStateChanged(connectionInfo: ConnectionInfo) {
        // 默认空实现
    }
    
    override fun onDeviceConnected(device: BluetoothDevice, connectionInfo: ConnectionInfo) {
        // 默认空实现
    }
    
    override fun onDeviceDisconnected(device: BluetoothDevice, connectionInfo: ConnectionInfo) {
        // 默认空实现
    }
    
    override fun onConnectionFailed(device: BluetoothDevice, errorCode: Int, errorMessage: String) {
        // 默认空实现
    }
    
    override fun onDataReceived(dataRecord: DataRecord) {
        // 默认空实现
    }
    
    override fun onDataSent(data: ByteArray, deviceId: String) {
        // 默认空实现
    }
    
    override fun onDataSendFailed(data: ByteArray, deviceId: String, errorCode: Int, errorMessage: String) {
        // 默认空实现
    }
    
    override fun onProtocolMessageReceived(protocolMessage: com.example.launibleplugin.protocol.ProtocolMessage, deviceId: String) {
        // 默认空实现
    }
    
    override fun onServicesDiscovered(deviceId: String, services: List<String>) {
        // 默认空实现
    }
    
    override fun onCharacteristicChanged(deviceId: String, characteristicUuid: String, value: ByteArray) {
        // 默认空实现
    }
    
    override fun onBluetoothStateChanged(isEnabled: Boolean) {
        // 默认空实现
    }
    
    override fun onPermissionResult(permissions: Array<String>, grantResults: IntArray) {
        // 默认空实现
    }
    
    override fun onError(errorCode: Int, errorMessage: String, throwable: Throwable?) {
        // 默认空实现
    }
}